"""
如果活细胞周围八个位置的活细胞数少于两个，则该位置活细胞死亡；
如果活细胞周围八个位置有两个或三个活细胞，则该位置活细胞仍然存活；
如果活细胞周围八个位置有超过三个活细胞，则该位置活细胞死亡；
如果死细胞周围正好有三个活细胞，则该位置死细胞复活；

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/game-of-life
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
"""
from typing import List


class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        m = len(board)
        if not m:
            return 
        n = len(board[0])
        if not n:
            return

        def getNeighborsCount(x, y):
            """返回附件有多少细胞
            """
            # 八个方向
            d = (
                (x - 1, y - 1),
                (x - 1, y),
                (x - 1, y + 1),
                (x, y - 1),
                (x, y + 1),
                (x + 1, y - 1),
                (x + 1, y),
                (x + 1, y + 1),
            )
            res = 0
            for new_x, new_y in d:
                if (
                    new_x >= 0
                    and new_x < m
                    and new_y >= 0
                    and new_y < n
                    and board[new_x][new_y] == 1
                ):
                    res += 1
            return res
        record = []
        for i in range(m):
            for j in range(n):
                neighborsCount = getNeighborsCount(i, j)
                # 如果活细胞周围八个位置的活细胞数少于两个，则该位置活细胞死亡；
                if board[i][j] == 1 and neighborsCount < 2:
                    record.append((i, j, 0)) 
                # 如果活细胞周围八个位置有两个或三个活细胞，则该位置活细胞仍然存活；
                elif board[i][j] == 1 and (neighborsCount == 2 or neighborsCount == 3):
                    pass
                # 如果活细胞周围八个位置有超过三个活细胞，则该位置活细胞死亡；
                elif board[i][j] == 1 and neighborsCount > 3:
                    record.append((i, j, 0))
                # 如果死细胞周围正好有三个活细胞，则该位置死细胞复活；
                elif board[i][j] == 0 and neighborsCount == 3:
                    record.append((i, j, 1))

        for i, j, status in record:
            board[i][j] = status


                


if __name__ == "__main__":
    # b = [[0, 1, 0], [0, 0, 1], [1, 1, 1], [0, 0, 0]]
    b = [[1,1, 1]]
    Solution().gameOfLife(b)
    print(b)
